/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ModulHåndtering;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import jssc.SerialPort;
import static jssc.SerialPort.MASK_RXCHAR;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

/**
 *
 * @author Thor
 */
class ModulMC extends Modul {

    private boolean varmenErTændt = false;
    private boolean lampenErTændt = false;

    public ModulMC(SerialPort p) {
        port = p;
        navn = "ModulMC";

        indstillingerList = new ArrayList<>();
        indstillingerList.add("Temperatur");
        indstillingerList.add("Lysstyrke");

        indstillingerVærdiList = new ArrayList<>();
        indstillingerVærdiList.add(30);
        indstillingerVærdiList.add(500);

        //Tilføj Sensors
        sensorList = new ArrayList<>();
        sensorList.add(new SensorTemperatur());
        sensorList.add(new SensorLys());

        //Tilføj Controllers
        kontrollerList = new ArrayList<>();
        kontrollerList.add(new ControllerVarme());
        kontrollerList.add(new ControllerLysDiode());
        try {
            port.addEventListener(new SerialPortEventListener() {

                @Override
                public void serialEvent(SerialPortEvent serialPortEvent) {
                    try {
                        if (port.getInputBufferBytesCount() > 4) {
                            serielDataEvent();
                        }
                    } catch (SerialPortException ex) {
                        Logger.getLogger(ModulMC.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }, MASK_RXCHAR);
        } catch (SerialPortException ex) {
            System.err.println(ex);
        }
    }

    @Override
    public void serielDataEvent() {
        ArrayList<String> input = formatData(læsDataSerial());
        for (String s : input) {
            if (s != null) {
                if (s.startsWith("T")) {
                    try {
                        formatter(0, s);
                        int temperatur = Integer.parseInt(s.substring(1));
                        temperaturStyring(temperatur);
                    } catch (NumberFormatException e) {
                    }
                } else if (s.startsWith("L")) {
                    try {
                        formatter(1, s);
                        int lux = Integer.parseInt(s.substring(1));
                        lysStyring(lux);
                    } catch (NumberFormatException e) {
                    }
                }
            }
        }
    }

    public void temperaturStyring(int temperatur) {
        if (temperatur >= indstillingerVærdiList.get(0) && !varmenErTændt) {
            skrivSerial(kontrollerList.get(0).overSætCmd(Protokol.TÆND_FOR_CONTROLLER));
            varmenErTændt = true;

        } else {
            if (temperatur < indstillingerVærdiList.get(0) && varmenErTændt) {
                skrivSerial(kontrollerList.get(0).overSætCmd(Protokol.TÆND_FOR_CONTROLLER));
                varmenErTændt = false;
            }
        }
    }

    private void lysStyring(int lux) {
        if (indstillingerVærdiList.get(1) > lux && !lampenErTændt) {
            skrivSerial(kontrollerList.get(1).overSætCmd(Protokol.TÆND_FOR_CONTROLLER));
            lampenErTændt = true;

        } else {
            if (lux >= indstillingerVærdiList.get(1) && lampenErTændt) {
                skrivSerial(kontrollerList.get(1).overSætCmd(Protokol.TÆND_FOR_CONTROLLER));
                lampenErTændt = false;
            }
        }
    }

}
